home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / util / time / LocaleTime.lha / localetime / localetime.e < prev    next >
Text File  |  1996-12-21  |  5KB  |  193 lines

  1. /*
  2.     LocaleTime version 1.0
  3.     Copyright (C) 1996 Piotr Pawlow (PP/UNION)
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. MODULE 'locale','libraries/locale','dos/notify','exec/ports','exec/nodes',
  21.        'amigalib/ports','devices/timer','exec/io','resources/battclock',
  22.        'detatch','dos/dos'
  23.  
  24. DEF myport=0:PTR TO mp
  25. DEF ioreq=0:PTR TO timerequest
  26. DEF clockresbase
  27.  
  28. PROC main() HANDLE
  29. DEF notr:notifyrequest,port:PTR TO mp,msg:PTR TO mn
  30. DEF oldtimecorrection,settingsfile,handle
  31.  
  32.   detatch('LocaleTime')
  33.  
  34.   settingsfile:='S:LocaleTime.settings'
  35.  
  36.   Forbid()
  37.     port:=FindPort('localetime_port')
  38.   Permit()
  39.   IF port THEN Raise("INST")
  40.   IF (myport:=CreateMsgPort())=0 THEN Raise("PORT")
  41.   myport.ln.name:='localetime_port'
  42.   AddPort(myport)
  43.   notr.port:=myport
  44.   notr.flags:=NRF_SEND_MESSAGE
  45.   notr.name:='ENV:sys/locale.prefs'
  46.   IF (StartNotify(notr)=0) THEN Raise("NOTF")
  47.   readoffset()
  48.   IF (handle:=Open(settingsfile,OLDFILE))
  49.     Read(handle,{timecorrection},4)
  50.     Close(handle)
  51.   ENDIF
  52.   oldtimecorrection:=Long({timecorrection})
  53.   IF (clockresbase:=OpenResource('battclock.resource'))=0 THEN Raise("RESR")
  54.   PutLong({oldreadclock},SetFunction(clockresbase,-12,{newreadclock}))
  55.   PutLong({oldwriteclock},SetFunction(clockresbase,-18,{newwriteclock}))
  56.   opentimer()
  57.   settime(readclock())
  58.   LOOP
  59.     IF msg:=GetMsg(myport)
  60.       addtime(readoffset())
  61.       ReplyMsg(msg)
  62.     ENDIF
  63.     IF CtrlC() THEN Raise("CTRC")
  64.     IF (Long({timecorrection})<>oldtimecorrection)
  65.       oldtimecorrection:=Long({timecorrection})
  66.       IF oldtimecorrection=0
  67.         DeleteFile(settingsfile)
  68.       ELSE
  69.         IF (handle:=Open(settingsfile,NEWFILE))
  70.           Write(handle,{timecorrection},4)
  71.           Close(handle)
  72.         ELSE
  73.           information('Couldn''t write settings')
  74.         ENDIF
  75.       ENDIF
  76.     ENDIF
  77.     Delay(50)
  78.   ENDLOOP
  79.  
  80. EXCEPT DO
  81.   closetimer()
  82.   IF Long({oldreadclock})
  83.     SetFunction(clockresbase,-12,Long({oldreadclock}))
  84.     SetFunction(clockresbase,-18,Long({oldwriteclock}))
  85.     EndNotify(notr)
  86.   ENDIF
  87.   IF myport
  88.     RemPort(myport)
  89.     DeleteMsgPort(myport)
  90.   ENDIF
  91.   SELECT exception
  92.     CASE "LOCL"; information('Couldn''t open locale.library\n')
  93.     CASE "RESR"; information('Couldn''t open battclock.resource\n')
  94.     CASE "PORT"; information('Couldn''t create message port\n')
  95.     CASE "OLOC"; information('Couldn''t open locale\n')
  96.     CASE "NOTF"; information('Couldn''t start notification on ENV:sys/locale.prefs\n')
  97.     CASE "INST"
  98.       IF information('LocaleTime is already installed.\nDo you want to remove it ?','Yes|No','LocaleTime request')=1
  99.         Forbid()
  100.           port:=FindPort('localetime_port')
  101.         Permit()
  102.         IF port THEN Signal(port.sigtask,SIGBREAKF_CTRL_C)
  103.       ENDIF
  104.     CASE "TIMR"; WriteF('Couldn''t open timer.device\n')
  105.   ENDSELECT
  106. ENDPROC 0
  107.  
  108. PROC information(text,gads=0,winname=0)
  109.   IF gads=0 THEN gads:='OK'
  110.   IF winname=0 THEN winname:='LocaleTime information:'
  111. ENDPROC EasyRequestArgs(NIL,[20,0,winname,text,gads],0,0)
  112.  
  113. PROC readoffset()
  114. DEF loc:PTR TO locale,oldoffset
  115.   IF (localebase:=OpenLibrary('locale.library',0))=0 THEN Raise("LOCL")
  116.   IF (loc:=OpenLocale(NIL))=0 THEN Raise("OLOC")
  117.   oldoffset:=Long({timeoffset})
  118.   PutLong({timeoffset},-loc.gmtoffset*60)
  119.   CloseLocale(loc)
  120.   CloseLibrary(localebase)
  121. ENDPROC Long({timeoffset})-oldoffset
  122.  
  123. PROC opentimer()
  124.   IF (ioreq:=CreateIORequest(myport,SIZEOF timerequest))=0 THEN Raise("IORQ")
  125.   IF OpenDevice('timer.device',0,ioreq,0) THEN Raise("TIMR")
  126. ENDPROC
  127.  
  128. PROC closetimer()
  129.   IF ioreq
  130.     CloseDevice(ioreq)
  131.     DeleteIORequest(ioreq)
  132.   ENDIF
  133. ENDPROC
  134.  
  135. PROC settime(s,m=0)
  136.   ioreq.io.command:=TR_SETSYSTIME
  137.   ioreq.io.flags:=0
  138.   ioreq.time.secs:=s
  139.   ioreq.time.micro:=m
  140.   DoIO(ioreq)
  141. ENDPROC
  142.  
  143. PROC gettime()
  144. DEF s,m
  145.   ioreq.io.command:=TR_GETSYSTIME
  146.   ioreq.io.flags:=0
  147.   DoIO(ioreq)
  148.   s:=ioreq.time.secs
  149.   m:=ioreq.time.micro
  150. ENDPROC s,m
  151.  
  152. PROC addtime(offset)
  153. DEF s,m
  154.   s,m:=gettime()
  155.   settime(s+offset,m)
  156. ENDPROC
  157.  
  158. PROC readclock()
  159.     MOVE.L  clockresbase,A6
  160.     JSR     -12(A6)
  161. ENDPROC D0
  162.  
  163. newreadclock:
  164.     MOVE.L  A3,-(A7)
  165.     MOVE.L  oldreadclock(PC),A3
  166.     JSR     (A3)
  167.     MOVE.L  (A7)+,A3
  168.     ADD.L   timeoffset(PC),D0
  169.     ADD.L   timecorrection(PC),D0
  170.     RTS
  171.  
  172. newwriteclock:
  173.     SUB.L   timeoffset(PC),D0
  174.     MOVEM.L D0/D1/A3,-(A7)
  175.     MOVE.L  D0,-(A7)
  176.     MOVE.L  oldwriteclock(PC),A3
  177.     JSR     (A3)
  178.     MOVE.L  oldreadclock(PC),A3
  179.     JSR     (A3)
  180.     MOVE.L  (A7)+,D1
  181.     SUB.L   D0,D1
  182.     LEA     timecorrection(PC),A3
  183.     MOVE.L  D1,(A3)
  184.     MOVEM.L (A7)+,D0/D1/A3
  185.     RTS
  186.  
  187. oldreadclock:   LONG 0
  188. oldwriteclock:  LONG 0
  189. timeoffset:     LONG 0
  190. timecorrection: LONG 0
  191.  
  192. CHAR '$VER: LocaleTime 1.0 (19-12-1996) by PP/UNION.',0
  193.